home *** CD-ROM | disk | FTP | other *** search
Oberon Document | 1994-06-07 | 10.7 KB | 346 lines | [oODC/obnF] |
- Documents.StdDocumentDesc
- Documents.DocumentDesc
- Containers.ViewDesc
- Views.ViewDesc
- Stores.StoreDesc
- Documents.ModelDesc
- Containers.ModelDesc
- Models.ModelDesc
- Stores.ElemDesc
- TextViews.StdViewDesc
- TextViews.ViewDesc
- TextModels.StdModelDesc
- TextModels.ModelDesc
- TextModels.AttributesDesc
- Geneva
- Geneva
- StdStamps.StdViewDesc
- Geneva
- MODULE OmosiViews;
- (** OmInc
- IMPORT Domains, Ports, Stores, Models, Views, Controllers, Properties, Dialog;
- CONST
- (* Kind *)
- outside = -1; white = 0; top = 1; left = 2; right = 3;
- version = 0;
- TYPE
- Palette = ARRAY 4 OF Ports.Color;
- Kind = INTEGER;
- Field = RECORD
- kind: Kind;
- sel: BOOLEAN
- END;
- Row = ARRAY 8 OF Field;
- Model = ARRAY 15 OF Row;
- StdView = POINTER TO StdViewDesc;
- StdViewDesc = RECORD (Views.ViewDesc)
- pal: Palette;
- mod: Model;
- sel: INTEGER;
- grid: BOOLEAN
- END;
- FieldPath = ARRAY 3 OF Ports.Point;
- FieldOp = POINTER TO FieldOpDesc;
- FieldOpDesc = RECORD (Domains.OperationDesc)
- v: StdView; i, j: INTEGER; kind: Kind
- END;
- ColorOp = POINTER TO ColorOpDesc;
- ColorOpDesc = RECORD (Domains.OperationDesc)
- v: StdView; n: INTEGER; col: Ports.Color
- END;
- UpdateMsg = RECORD (Views.Message)
- i, j: INTEGER
- END;
- PROCEDURE InitRow (VAR row: Row; k: INTEGER);
- VAR i, l, r: INTEGER;
- BEGIN
- l := (8 - k) DIV 2; r := 8 - l;
- i := 0; WHILE i < l DO row[i].kind := outside; INC(i) END;
- WHILE i < r DO row[i].kind := white; INC(i) END;
- WHILE i < 8 DO row[i].kind := outside; INC(i) END;
- i := 0; WHILE i < 8 DO row[i].sel := FALSE; INC(i) END
- END InitRow;
- PROCEDURE InitPalette (VAR p: Palette);
- BEGIN
- p[white] := Ports.grey12;
- p[top] := Ports.grey25; p[left] := Ports.grey50; p[right] := Ports.grey75;
- END InitPalette;
- PROCEDURE InitModel (VAR m: Model);
- VAR j: INTEGER;
- BEGIN
- InitRow(m[0], 2); InitRow(m[1], 4); InitRow(m[2], 6);
- j := 3; WHILE j < 12 DO InitRow(m[j], 8); INC(j) END;
- InitRow(m[12], 6); InitRow(m[13], 4); InitRow(m[14], 2)
- END InitModel;
- PROCEDURE Init (v: StdView);
- BEGIN
- InitPalette(v.pal); InitModel(v.mod); v.sel := 0; v.grid := TRUE
- END Init;
- PROCEDURE H (s: LONGINT): LONGINT;
- BEGIN
- RETURN s * 500 DIV 866
- END H;
- PROCEDURE S (h: LONGINT): LONGINT;
- BEGIN
- RETURN h * 866 DIV 500
- END S;
- PROCEDURE GetFieldPath (v: StdView; f: Ports.Frame; i, j: INTEGER; VAR p: FieldPath);
- VAR w, h, s: LONGINT; kind: Kind;
- BEGIN
- v.context.GetSize(w, h); s := w DIV 8; h := H(s);
- kind := v.mod[j, i].kind;
- IF ODD(i + j) THEN
- p[0].x := i * s; p[0].y := (j + 1) * h;
- p[1].x := (i + 1) * s; p[1].y := j * h;
- p[2].x := (i + 1) * s; p[2].y := (j + 2) * h
- ELSE
- p[0].x := i * s; p[0].y := j * h;
- p[1].x := (i + 1) * s; p[1].y := (j + 1) * h;
- p[2].x := i * s; p[2].y := (j + 2) * h
- END
- END GetFieldPath;
- PROCEDURE ValidField (v: StdView; i, j: INTEGER): BOOLEAN;
- BEGIN
- RETURN (0 <= i) & (i < 8) & (0 <= j) & (j < 15) & (v.mod[j, i].kind > outside)
- END ValidField;
- PROCEDURE DrawField (v: StdView; f: Ports.Frame; i, j: INTEGER);
- VAR col: Ports.Color; p: FieldPath;
- BEGIN
- IF ValidField(v, i, j) THEN
- col := v.pal[v.mod[j, i].kind]; GetFieldPath(v, f, i, j, p);
- f.DrawPath(p, 3, Ports.fill, col, Ports.closedPoly);
- IF v.mod[j, i].sel THEN
- f.DrawPath(p, 3, 0, Ports.black, Ports.closedPoly)
- ELSIF v.grid THEN
- f.DrawPath(p, 3, 0, Ports.white, Ports.closedPoly)
- ELSE
- f.DrawPath(p, 3, 0, col, Ports.closedPoly)
- END
- END
- END DrawField;
- PROCEDURE SelectField (v: StdView; f: Ports.Frame; i, j: INTEGER; sel: BOOLEAN);
- VAR col: Ports.Color; p: FieldPath; kind: Kind;
- BEGIN
- IF ValidField(v, i, j) & (v.mod[j, i].sel # sel) THEN
- v.mod[j, i].sel := sel;
- IF sel THEN INC(v.sel) ELSE DEC(v.sel) END;
- DrawField(v, f, i, j)
- END
- END SelectField;
- PROCEDURE LocateField (v: StdView; f: Views.Frame; x, y: LONGINT; VAR i, j: INTEGER);
- VAR u, w, h, s, sx, sy, mx, my: LONGINT;
- BEGIN
- v.context.GetSize(w, h); s := w DIV 8;
- u := f.unit; h := H(s);
- sx := x DIV s; sy := y DIV h;
- IF (0 <= sx) & (sx < 9) & (0 <= sy) & (sy < 16) THEN
- i := SHORT(sx); j := SHORT(sy);
- IF ODD(i + j) THEN
- IF (s - x) MOD s * (h DIV u) >= y MOD h * (s DIV u) THEN DEC(j) END
- ELSE
- IF x MOD s * (h DIV u) >= y MOD h * (s DIV u) THEN DEC(j) END
- END;
- IF (i = 8) OR (j = 15) OR (j >= 0) & (v.mod[j, i].kind = outside) THEN j := -1 END
- ELSE j := -1
- END
- END LocateField;
- PROCEDURE Select (v: StdView; set: BOOLEAN);
- VAR i, j, sel: INTEGER;
- BEGIN
- j := 0;
- WHILE j < 15 DO
- i := 0; WHILE i < 8 DO v.mod[j, i].sel := set; INC(i) END;
- INC(j)
- END;
- IF set THEN sel := 64 ELSE sel := 0 END;
- IF v.sel # sel THEN v.sel := sel; Views.Update(v, Views.keepFrames) END
- END Select;
- PROCEDURE Track (v: StdView; f: Views.Frame; x, y: LONGINT; buttons: SET);
- VAR script: Domains.Operation; op: FieldOp; cop: ColorOp; col: Ports.Color;
- i, j, i0, j0, i1, j1: INTEGER; isDown, prevSel, setCol: BOOLEAN;
- BEGIN
- LocateField(v, f, x, y, i, j); i0 := i; j0 := j; prevSel := ValidField(v, i, j) & v.mod[j, i].sel;
- SelectField(v, f, i, j, TRUE);
- REPEAT
- f.Input(x, y, isDown);
- LocateField(v, f, x, y, i1, j1);
- IF (i1 # i) OR (j1 # j) THEN
- IF ~(Controllers.extend IN buttons) THEN SelectField(v, f, i, j, FALSE) END;
- i := i1; j := j1;
- SelectField(v, f, i, j, TRUE)
- END
- UNTIL ~isDown;
- IF ~(Controllers.extend IN buttons) & ((i # i0) OR (j # j0) OR ~prevSel) THEN
- SelectField(v, f, i, j, FALSE)
- END;
- IF ValidField(v, i, j) THEN
- IF Controllers.modify IN buttons THEN
- Dialog.GetColor(v.pal[v.mod[j, i].kind], col, setCol);
- IF setCol THEN
- NEW(cop); cop.v := v; cop.n := v.mod[j, i].kind; cop.col := col;
- Views.Do(v, "Color Change", cop)
- END
- ELSIF ~(Controllers.extend IN buttons) THEN
- Views.BeginScript(v, "Isomo Change", script);
- j := 0;
- WHILE j < 15 DO
- i := 0;
- WHILE i < 8 DO
- IF (v.mod[j, i].sel OR (i = i1) & (j = j1)) & (v.mod[j, i].kind > outside) THEN
- NEW(op); op.v := v; op.i := i; op.j := j;
- op.kind := (v.mod[j, i].kind + 1) MOD 4;
- Views.Do(v, "", op)
- END;
- INC(i)
- END;
- INC(j)
- END;
- Views.EndScript(v, script)
- END
- ELSE Select(v, FALSE)
- END
- END Track;
- (* FieldOp *)
- PROCEDURE (op: FieldOp) Do;
- VAR k: Kind; msg: UpdateMsg;
- BEGIN
- k := op.v.mod[op.j, op.i].kind;
- op.v.mod[op.j, op.i].kind := op.kind;
- op.kind := k;
- msg.i := op.i; msg.j := op.j; Views.Broadcast(op.v, msg)
- END Do;
- (* ColorOp *)
- PROCEDURE (op: ColorOp) Do;
- VAR c: Ports.Color;
- BEGIN
- c := op.v.pal[op.n]; op.v.pal[op.n] := op.col; op.col := c;
- Views.Update(op.v, Views.keepFrames)
- END Do;
- (* View *)
- PROCEDURE (v: StdView) Externalize (VAR wr: Stores.Writer);
- VAR i, j: INTEGER;
- BEGIN
- v.Externalize^(wr);
- wr.WriteVersion(version);
- i := 0; WHILE i < 4 DO wr.WriteLInt(v.pal[i]); INC(i) END;
- j := 0;
- WHILE j < 15 DO
- i := 0; WHILE i < 8 DO wr.WriteInt(v.mod[j, i].kind); INC(i) END;
- INC(j)
- END
- END Externalize;
- PROCEDURE (v: StdView) Internalize (VAR rd: Stores.Reader);
- VAR i, j: INTEGER; ver: SHORTINT;
- BEGIN
- v.Internalize^(rd);
- IF rd.cancelled THEN RETURN END;
- rd.ReadVersion(version, version, ver);
- IF rd.cancelled THEN RETURN END;
- i := 0; WHILE i < 4 DO rd.ReadLInt(v.pal[i]); INC(i) END;
- j := 0;
- WHILE j < 15 DO
- i := 0; WHILE i < 8 DO rd.ReadInt(v.mod[j, i].kind); v.mod[j, i].sel := FALSE; INC(i) END;
- INC(j)
- END;
- v.grid := FALSE
- END Internalize;
- PROCEDURE (v: StdView) CopyFrom (source: Views.View);
- BEGIN
- v.CopyFrom^(source);
- WITH source: StdView DO
- v.pal := source.pal; v.mod := source.mod;
- v.sel := source.sel; v.grid := FALSE
- END
- END CopyFrom;
- PROCEDURE (v: StdView) Restore (f: Views.Frame; l, t, r, b: LONGINT);
- VAR i, j: INTEGER;
- BEGIN
- j := 0;
- WHILE j < 15 DO
- i := 0; WHILE i < 8 DO DrawField(v, f, i, j); INC(i) END;
- INC(j)
- END
- END Restore;
- PROCEDURE (v: StdView) HandleViewMsg (f: Views.Frame; VAR msg: Views.Message);
- BEGIN
- WITH msg: UpdateMsg DO
- DrawField(v, f, msg.i, msg.j)
- ELSE
- END
- END HandleViewMsg;
- PROCEDURE (v: StdView) HandleCtrlMsg (f: Views.Frame; VAR msg: Controllers.Message;
- VAR focus: Views.View);
- VAR i, j, sel: INTEGER;
- BEGIN
- WITH msg: Controllers.TrackMsg DO
- Track(v, f, msg.x, msg.y, msg.modifiers)
- | msg: Controllers.PollOpsMsg DO
- msg.selectable := TRUE; msg.deselectable := TRUE; msg.valid := {Controllers.copy}
- | msg: Controllers.EditMsg DO
- IF msg.op = Controllers.copy THEN
- msg.view := Views.CopyOf(v, Views.deep); v.context.GetSize(msg.w, msg.h)
- END
- | msg: Controllers.SelectMsg DO
- Select(v, msg.set)
- ELSE
- END
- END HandleCtrlMsg;
- PROCEDURE (v: StdView) HandlePropMsg (VAR msg: Properties.Message);
- BEGIN
- WITH msg: Properties.SizePref DO
- IF (msg.w > Views.undefined) & (msg.h > Views.undefined) THEN
- Properties.ProportionalConstraint(1000, 2 * H(1000), msg.w, msg.h)
- ELSE
- msg.w := 8 * (7 * Ports.mm); msg.h := 16 * H(7 * Ports.mm)
- END;
- INC(msg.h, 1 * Ports.mm)
- ELSE
- END
- END HandlePropMsg;
- (* commands *)
- PROCEDURE Deposit*;
- VAR v: StdView;
- BEGIN
- NEW(v); v.Init; Init(v); Views.Deposit(v)
- END Deposit;
- PROCEDURE ToggleGrid*;
- VAR v: Views.View;
- BEGIN
- v := Controllers.FocusView();
- IF v # NIL THEN
- WITH v: StdView DO
- v.grid := ~v.grid; Views.Update(v, Views.keepFrames)
- ELSE
- END
- END
- END ToggleGrid;
- PROCEDURE ResetColors*;
- VAR v: Views.View; p0: Palette; script: Domains.Operation; cop: ColorOp; i: INTEGER;
- BEGIN
- v := Controllers.FocusView();
- IF v # NIL THEN
- WITH v: StdView DO
- Views.BeginScript(v, "Reset Colors", script);
- InitPalette(p0);
- i := 0;
- WHILE i < 4 DO
- NEW(cop); cop.v := v; cop.n := i; cop.col := p0[i]; Views.Do(v, "", cop); INC(i)
- END;
- Views.EndScript(v, script)
- ELSE
- END
- END
- END ResetColors;
- END OmosiViews.
- TextControllers.StdCtrlDesc
- TextControllers.ControllerDesc
- Containers.ControllerDesc
- Controllers.ControllerDesc
- TextRulers.StdRulerDesc
- TextRulers.RulerDesc
- TextRulers.StdStyleDesc
- TextRulers.StyleDesc
- TextRulers.AttributesDesc
- Geneva
- Documents.ControllerDesc
-